/*
 * @Author: 0x9DEFA478
 * @Date: 2021-04-21 18:51:32
 * @LastEditTime: 2024-08-18 21:13:44
 * @LastEditors: 0x9DEFA478
 * @Description: 外设方法 在此进行实例化和初始化
 * QQ:2652450237
 * ============================================================================================================================================
 * 
 * 
 * 
 *                                                                                               ************      ****************************
 *                                                                                             ************      ****************************  
 *                                                                                           ************      ****************************    
 *                                                                                         ************      ****************************      
 *                                                                                       ************      ************                        
 *                                                                                     ************      ************                          
 *                                                                                   ************      ************                            
 *                                                                                 ************      ************                              
 *                                                                               ************      ************                                
 *                                                                             ************      ************                                  
 *                                                                           ************      ************                                    
 *                                                                         ************      ************                                      
 *                                                                       ************      ************                                        
 *                                                                     ************      ************                                          
 *                                                                   ************      ************                                            
 *                                                                 ************      ************                                              
 *                                                               ************      ************                                                
 *                                                             ************      ************                                                  
 *                                                           ************      ************                                                    
 *                                                         ************      ************                                                      
 *                                                       ************      ************                                                        
 *                                                     ************      ************                                                          
 *                                                   ************      ************                                                            
 *                                                 ************      ************                                                              
 *                                               ************      ************                                                                
 *                                             ************      ************                                                                  
 *                                           ************      ************                                                                    
 *                                         ************      ************                                                                      
 *                                       ************      ************                                                                        
 *                                     ************      ************                                                                          
 *                                   ************      ************                                                                            
 *                                 ************      ************                                                                              
 *                               ************      ************                                                                                
 *                             ************      ************                                                                                  
 *                           ************      ************                                                                                    
 *                         ************      ************                                                                                      
 *       ****************************      ************                                                                                        
 *     ****************************      ************                                                                                          
 *   ****************************      ************                                                                                            
 * ****************************      ************                                                                                              
 * 
 * 
 * 
 * ============================================================================================================================================
 * 
 */

#include "Peripheral.h"
#include "stm32h7xx_hal.h"




/**
 * @brief STM32时钟初始化
 * @return 无
 */
void SystemClock_Config(void);

/**
 * @brief 将时钟恢复到复位状态(关闭PLL 使用HSI为系统时钟)
 * @return 无
 */
void SystemClock_DeInit(void);

void MPU_Config(void);




static void PeripheralClkSelConfig(void);




void systick_irq_callback(void* v){
}




/**
 * @brief 系统初始化 (MPU 缓存 时钟)
 * @return 无
 */
void Peripherals_SysInit(){

  //打开相应的异常中断
  SCB->SHCSR|=SCB_SHCSR_USGFAULTENA_Msk|SCB_SHCSR_BUSFAULTENA_Msk|SCB_SHCSR_MEMFAULTENA_Msk;

  MPU_Config();
  SCB_EnableICache();
  SCB_EnableDCache();

  HAL_Init();

  SystemClock_Config();
	TimeTick_Init(480000000,systick_irq_callback,NULL);
	
  MX_TIM5_Init();
  HAL_TIM_Base_Start(&htim5);

}

/**
 * @brief 外设初始化
 * @return 无
 */
void Peripherals_Init(){

  Peripherals_Instence_LockInit();
  
  MemoryMalloc_Init();

  H_TS_Lock_Lock(ip_rcc_Lock);

  MX_DMA_Init();
  MX_USART1_UART_Init();

  
  I_DebugPort_Init();
  I_DebugPort_SetValid(-1);
  H_Printf_Init();
  
  H_TS_Lock_Unlock(ip_rcc_Lock);
}

/**
 * @brief 关闭所有外设(用于跳转bootloader之前)
 * @return 无
 */
void Peripherals_DeInit(){
  

  SysTick->CTRL=0;

  SystemClock_DeInit();
  
}




/**
 * @brief 将时钟恢复到复位状态(关闭PLL 使用HSI为系统时钟)
 * @return 无
 */
void SystemClock_DeInit(){
  
  if((RCC->CFGR&RCC_CFGR_SWS_Msk)!=RCC_CFGR_SWS_HSI){
    //如果系统时钟源不为HSI

    if((RCC->CR&RCC_CR_HSION)!=0U){
      RCC->CR&=(~RCC_CR_HSION);
    }
    while((RCC->CR&RCC_CR_HSIRDY)!=0U){
      //等待HSI关闭
    }

    RCC->CR=(RCC->CR&(~RCC_CR_HSIDIV_Msk))|(RCC_CR_HSIDIV_Msk&(0x00<<RCC_CR_HSIDIV_Pos));//1分频HSI

    RCC->CR|=RCC_CR_HSION;//使能HSI
    while((RCC->CR&RCC_CR_HSIRDY)==0U){
      //等待HSI稳定
    }

    RCC->CFGR=(RCC->CFGR&(~RCC_CFGR_SW_Msk))|RCC_CFGR_SW_HSI;
    while((RCC->CFGR&RCC_CFGR_SWS_Msk)!=RCC_CFGR_SWS_HSI){
      //等待时钟切换完成
    }
  }
  //此时系统时钟变为HSI

  


  //关闭所有的PLL
  PLL1_SetStatus(0);
  PLL2_SetStatus(0);
  PLL3_SetStatus(0);

}

/**
 * @brief STM32时钟初始化
 * @return 无
 */
void SystemClock_Config(void){

  SystemClock_DeInit();

  PWR->CR3 |= PWR_CR3_LDOEN;

  PWR->D3CR = (PWR->D3CR&(~PWR_D3CR_VOS_Msk))|(PWR_D3CR_VOS_Msk&(0x03<<PWR_D3CR_VOS_Pos));
  while((PWR->D3CR&PWR_D3CR_VOSRDY)!=PWR_D3CR_VOSRDY){
    //等待电压等级就绪
  }
  SYSCFG->PWRCR|=SYSCFG_PWRCR_ODEN;//开启OverDrive模式(开启这个才能将CPU频率提升到480MHz)
  while((PWR->D3CR&PWR_D3CR_VOSRDY)!=PWR_D3CR_VOSRDY){
    //等待电压等级就绪
  }


  //如果HSE未使能
  if((RCC->CR&RCC_CR_HSEON)!=RCC_CR_HSEON){
    RCC->CR|=RCC_CR_HSEON;
  }
  while((RCC->CR&RCC_CR_HSERDY)!=RCC_CR_HSERDY){
    //等待HSE稳定
  }

  //如果CSI未使能 (IO补偿单元需要CSI)
  if((RCC->CR&RCC_CR_CSION)!=RCC_CR_CSION){
    RCC->CR|=RCC_CR_CSION;
  }
  while((RCC->CR&RCC_CR_CSIRDY)!=RCC_CR_CSIRDY){
    //等待CSI稳定
  }

  // //如果HSI48未使能
  // if((RCC->CR&RCC_CR_HSI48ON)!=RCC_CR_HSI48ON){
  //   RCC->CR|=RCC_CR_HSI48ON;
  // }
  // while((RCC->CR&RCC_CR_HSI48RDY)!=RCC_CR_HSI48RDY){
  //   //等待HSI48稳定
  // }
  

  //清除预分配配置并且PLL时钟选择为HSE
  RCC->PLLCKSELR=(0x00000000U&(~RCC_PLLCKSELR_PLLSRC_Msk))|RCC_PLLCKSELR_PLLSRC_HSE;

  PLL1_SetOutput(1U,1U,0U);
  PLL1_SetDIV(25000000U,5U,192U,2U,6U,2U);
  PLL1_SetFracn(0U);

  PLL2_SetOutput(1U,0U,0U);
  // PLL2_SetDIV(25000000U,22U,397U,5U,2U,2U);
  PLL2_SetDIV(25000000U,11U,216U,5U,2U,2U);
  // PLL2_SetFracn(3227U);
  PLL2_SetFracn(2202U);

  PLL3_SetOutput(0U,0U,0U);
  PLL3_SetDIV(25000000U,5U,96U,3U,10U,10U);
  PLL3_SetFracn(0U);

  //启动PLL
  PLL1_SetStatus(1U);
  PLL2_SetStatus(1U);
  //PLL3_SetStatus(1U);

  //设置分频
  RCC->D1CFGR = RCC_D1CFGR_D1CPRE_DIV1 | RCC_D1CFGR_HPRE_DIV2 | RCC_D1CFGR_D1PPRE_DIV2;
  RCC->D2CFGR = RCC_D2CFGR_D2PPRE1_DIV2 | RCC_D2CFGR_D2PPRE2_DIV2;
  RCC->D3CFGR = RCC_D3CFGR_D3PPRE_DIV2;

	//设置Flash延时
  FLASH->ACR=(FLASH->ACR&(~(FLASH_ACR_LATENCY_Msk|FLASH_ACR_WRHIGHFREQ_Msk)))|FLASH_ACR_LATENCY_4WS|(0x2U<<FLASH_ACR_WRHIGHFREQ_Pos);

  //切换系统时钟到PLL
  RCC->CFGR=(RCC->CFGR&(~RCC_CFGR_SW_Msk))|RCC_CFGR_SW_PLL1;
  while((RCC_CFGR_SWS_Msk&RCC->CFGR)!=RCC_CFGR_SWS_PLL1){
    //等待切换完毕
  }

  //更新SystemCoreClock
  SystemCoreClockUpdate();
  //SystemCoreClock=480000000U;


  PeripheralClkSelConfig();
  
}

/**
 * @brief 外设时钟源选择配置
 * @return 无
 */
static void PeripheralClkSelConfig(){

  //域 1 内核时钟配置寄存器
  RCC->D1CCIPR=

    //per_ck 时钟源选择
    //0x0U：将 hsi_ker_ck 时钟选作 per_ck 时钟（复位后的默认值）
    //0x1U：将 csi_ker_ck 时钟选作 per_ck 时钟
    //0x2U：将 hse_ck 时钟选作 per_ck 时钟
    (RCC_D1CCIPR_CKPERSEL_Msk&(0x0U<<RCC_D1CCIPR_CKPERSEL_Pos))|

    //SDMMC 内核时钟源选择
    //0x0U：将 pll1_q_ck 时钟选作内核外设时钟（复位后的默认值）
    //0x1U：将 pll2_r_ck 时钟选作内核外设时钟
    (RCC_D1CCIPR_SDMMCSEL_Msk&(0x0U<<RCC_D1CCIPR_SDMMCSEL_Pos))|

    //QUADSPI 内核时钟源选择
    //0x0U：将 rcc_hclk3 时钟选作内核外设时钟（复位后的默认值）
    //0x1U：将 pll1_q_ck 时钟选作内核外设时钟
    //0x2U：将 pll2_r_ck 时钟选作内核外设时钟
    //0x3U：将 per_ck 时钟选作内核外设时钟
    (RCC_D1CCIPR_QSPISEL_Msk&(0x0U<<RCC_D1CCIPR_QSPISEL_Pos))|
    
    //FMC 内核时钟源选择
    //0x0U：将 rcc_hclk3 时钟选作内核外设时钟（复位后的默认值）
    //0x1U：将 pll1_q_ck 时钟选作内核外设时钟
    //0x2U：将 pll2_r_ck 时钟选作内核外设时钟
    //0x3U：将 per_ck 时钟选作内核外设时钟
    (RCC_D1CCIPR_FMCSEL_Msk&(0x0U<<RCC_D1CCIPR_FMCSEL_Pos));



  //域 2 内核时钟配置寄存器 1
  RCC->D2CCIP1R=

    //SWPMI 内核时钟源选择
    //由软件置 1 和复位。
    //0x0U：将 pclk 选作 SWPMI 内核时钟（复位后的默认值）
    //0x1U：将 hsi_ker_ck 时钟选作 SWPMI 内核时钟
    (RCC_D2CCIP1R_SWPSEL_Msk&(0x0U<<RCC_D2CCIP1R_SWPSEL_Pos))|

    //FDCAN 内核时钟源选择
    //由软件置 1 和复位。
    //0x0U：将 hse_ck 时钟选作 FDCAN 内核时钟（复位后的默认值）
    //0x1U：将 pll1_q_ck 时钟选作 FDCAN 内核时钟
    //0x2U：将 pll2_q_ck 时钟选作 FDCAN 内核时钟
    (RCC_D2CCIP1R_FDCANSEL_Msk&(0x0U<<RCC_D2CCIP1R_FDCANSEL_Pos))|

    //DFSDM1 内核 Clk 时钟源选择
    //由软件置 1 和复位。
    //注： 由 SAI1SEL 进行 DFSDM1 Aclk 时钟源选择。
    //0x0U：将 rcc_pclk2 选作 DFSDM1 Clk 内核时钟（复位后的默认值）
    //0x1U：将 sys_ck 时钟选作 DFSDM1 Clk 内核时钟
    (RCC_D2CCIP1R_DFSDM1SEL_Msk&(0x0U<<RCC_D2CCIP1R_DFSDM1SEL_Pos))|

    //SPDIFRX 内核时钟源选择 (SPDIFRX kernel clock source selection)
    //0x0U：将 pll1_q_ck 时钟选作 SPDIFRX 内核时钟（复位后的默认值）
    //0x1U：将 pll2_r_ck 时钟选作 SPDIFRX 内核时钟
    //0x2U：将 pll3_r_ck 时钟选作 SPDIFRX 内核时钟
    //0x3U：将 hsi_ker_ck 时钟选作 SPDIFRX 内核时钟
    (RCC_D2CCIP1R_SPDIFSEL_Msk&(0x0U<<RCC_D2CCIP1R_SPDIFSEL_Pos))|

    //SPI4 和 5 内核时钟源选择
    //0x0U：将 APB 时钟选作内核时钟（复位后的默认值）
    //0x1U：将 pll2_q_ck 时钟选作内核时钟
    //0x2U：将 pll3_q_ck 时钟选作内核时钟
    //0x3U：将 hsi_ker_ck 时钟选作内核时钟
    //0x4U：将 csi_ker_ck 时钟选作内核时钟
    (RCC_D2CCIP1R_SPI45SEL_Msk&(0x0U<<RCC_D2CCIP1R_SPI45SEL_Pos))|

    //SPI/I2S1、2 和 3 内核时钟源选择
    //0x0U：将 pll1_q_ck 时钟选作 SPI/I2S1、2 和 3 内核时钟（复位后的默认值）
    //0x1U：将 pll2_p_ck 时钟选作 SPI/I2S1、2 和 3 内核时钟
    //0x2U：将 pll3_p_ck 时钟选作 SPI/I2S1、2 和 3 内核时钟
    //0x3U：将 I2S_CKIN 时钟选作 SPI/I2S1、2 和 3 内核时钟
    //0x4U：将 per_ck 时钟选作 SPI/I2S1、2 和 3 内核时钟
    (RCC_D2CCIP1R_SPI123SEL_Msk&(0x0U<<RCC_D2CCIP1R_SPI123SEL_Pos))|

    //SAI2 和 SAI3 内核时钟源选择
    //0x0U：将 pll1_q_ck 时钟选作 SAI2 和 SAI3 内核时钟（复位后的默认值）
    //0x1U：将 pll2_p_ck 时钟选作 SAI2 和 SAI3 内核时钟
    //0x2U：将 pll3_p_ck 时钟选作 SAI2 和 SAI3 内核时钟
    //0x3U：将 I2S_CKIN 时钟选作 SAI2 和 SAI3 内核时钟
    //0x4U：将 per_ck 时钟选作 SAI2 和 SAI3 内核时钟
    (RCC_D2CCIP1R_SAI23SEL_Msk&(0x1U<<RCC_D2CCIP1R_SAI23SEL_Pos))|
    
    //SAI1 和 DFSDM1 内核 Aclk 时钟源选择
    //0x0U：将 pll1_q_ck 时钟选作 SAI1 和 DFSDM1 Aclk 内核时钟（复位后的默认值）
    //0x1U：将 pll2_p_ck 时钟选作 SAI1 和 DFSDM1 Aclk 内核时钟
    //0x2U：将 pll3_p_ck 时钟选作 SAI1 和 DFSDM1 Aclk 内核时钟
    //0x3U：将 I2S_CKIN 时钟选作 SAI1 和 DFSDM1 Aclk 内核时钟
    //0x4U：将 per_ck 时钟选作 SAI1 和 DFSDM1 Aclk 内核时钟
    (RCC_D2CCIP1R_SAI1SEL_Msk&(0x1U<<RCC_D2CCIP1R_SAI1SEL_Pos));


  //域 2 内核时钟配置寄存器 2
  RCC->D2CCIP2R=
    
    //LPTIM1 内核时钟源选择
    //0x0U：将 rcc_pclk1 时钟选作内核外设时钟（复位后的默认值）
    //0x1U：将 pll2_p_ck 时钟选作内核外设时钟
    //0x2U：将 pll3_r_ck 时钟选作内核外设时钟
    //0x3U：将 lse_ck 时钟选作内核外设时钟
    //0x4U：将 lsi_ck 时钟选作内核外设时钟
    //0x5U：将 per_ck 时钟选作内核外设时钟
    (RCC_D2CCIP2R_LPTIM1SEL_Msk&(0x0U<<RCC_D2CCIP2R_LPTIM1SEL_Pos))|

    //HDMI-CEC 内核时钟源选择
    //0x0U：将 lse_ck 时钟选作内核时钟（复位后的默认值）
    //0x1U：将 lsi_ck 时钟选作内核时钟
    //0x2U：将 122 分频的 csi_ker_ck 选作内核时钟
    (RCC_D2CCIP2R_CECSEL_Msk&(0x0U<<RCC_D2CCIP2R_CECSEL_Pos))|

    //USBOTG 1 和 2 内核时钟源选择
    //0x0U：禁止内核时钟（复位后的默认值）
    //0x1U：将 pll1_q_ck 时钟选作内核时钟
    //0x2U：将 pll3_q_ck 时钟选作内核时钟
    //0x3U：将 hsi48_ck 时钟选作内核时钟
    (RCC_D2CCIP2R_USBSEL_Msk&(0x3U<<RCC_D2CCIP2R_USBSEL_Pos))|

    //I2C1,2,3 内核时钟源选择
    //0x0U：将 rcc_pclk1 时钟选作内核时钟（复位后的默认值）
    //0x1U：将 pll3_r_ck 时钟选作内核时钟
    //0x2U：将 hsi_ker_ck 时钟选作内核时钟
    //0x3U：将 csi_ker_ck 时钟选作内核时钟
    (RCC_D2CCIP2R_I2C123SEL_Msk&(0x0U<<RCC_D2CCIP2R_I2C123SEL_Pos))|

    //RNG 内核时钟源选择
    //0x0U：将 hsi48_ck 时钟选作内核时钟（复位后的默认值）
    //0x1U：将 pll1_q_ck 时钟选作内核时钟
    //0x2U：将 lse_ck 时钟选作内核时钟
    //0x3U：将 lsi_ck 时钟选作内核时钟
    (RCC_D2CCIP2R_RNGSEL_Msk&(0x0U<<RCC_D2CCIP2R_RNGSEL_Pos))|

    //0x0U：将 rcc_pclk2 时钟选作内核时钟（复位后的默认值）
    //0x1U：将 pll2_q_ck 时钟选作内核时钟
    //0x2U：将 pll3_q_ck 时钟选作内核时钟
    //0x3U：将 hsi_ker_ck 时钟选作内核时钟
    //0x4U：将 csi_ker_ck 时钟选作内核时钟
    //0x5U：将 lse_ck 时钟选作内核时钟
    (RCC_D2CCIP2R_USART16SEL_Msk&(0x0U<<RCC_D2CCIP2R_USART16SEL_Pos))|
    
    //USART2/3、UART4,5、7/8 (APB1) 内核时钟源选择
    //0x0U：将 rcc_pclk1 时钟选作内核时钟（复位后的默认值）
    //0x1U：将 pll2_q_ck 时钟选作内核时钟
    //0x2U：将 pll3_q_ck 时钟选作内核时钟
    //0x3U：将 hsi_ker_ck 时钟选作内核时钟
    //0x4U：将 csi_ker_ck 时钟选作内核时钟
    //0x5U：将 lse_ck 时钟选作内核时钟
    (RCC_D2CCIP2R_USART28SEL_Msk&(0x0U<<RCC_D2CCIP2R_USART28SEL_Pos));


  //域 3 内核时钟配置寄存器
  RCC->D3CCIPR=

    //SPI6 内核时钟源选择
    //0x0U：将 rcc_pclk4 时钟选作内核外设时钟（复位后的默认值）
    //0x1U：将 pll2_q_ck 时钟选作内核外设时钟
    //0x2U：将 pll3_q_ck 时钟选作内核外设时钟
    //0x3U：将 hsi_ker_ck 时钟选作内核外设时钟
    //0x4U：将 csi_ker_ck 时钟选作内核外设时钟
    //0x5U：将 hse_ck 时钟选作内核外设时钟
    (RCC_D3CCIPR_SPI6SEL_Msk&(0x0U<<RCC_D3CCIPR_SPI6SEL_Pos))|

    //SAI4 子模块 B 内核时钟源选择
    //0x0U：将 pll1_q_ck 时钟选作内核外设时钟（复位后的默认值）
    //0x1U：将 pll2_p_ck 时钟选作内核外设时钟
    //0x2U：将 pll3_p_ck 时钟选作内核外设时钟
    //0x3U：将 I2S_CKIN 时钟选作内核外设时钟
    //0x4U：将 per_ck 时钟选作内核外设时钟
    (RCC_D3CCIPR_SAI4BSEL_Msk&(0x0U<<RCC_D3CCIPR_SAI4BSEL_Pos))|

    //SAI4 子模块 A 内核时钟源选择
    //0x0U：将 pll1_q_ck 时钟选作内核外设时钟（复位后的默认值）
    //0x1U：将 pll2_p_ck 时钟选作内核外设时钟
    //0x2U：将 pll3_p_ck 时钟选作内核外设时钟
    //0x3U：将 I2S_CKIN 时钟选作内核外设时钟
    //0x4U：将 per_ck 时钟选作内核外设时钟
    (RCC_D3CCIPR_SAI4ASEL_Msk&(0x0U<<RCC_D3CCIPR_SAI4ASEL_Pos))|

    //SAR ADC 内核时钟源选择
    //0x0U：将 pll2_p_ck 时钟选作内核外设时钟（复位后的默认值）
    //0x1U：将 pll3_r_ck 时钟选作内核外设时钟
    //0x2U：将 per_ck 时钟选作内核外设时钟
    (RCC_D3CCIPR_ADCSEL_Msk&(0x0U<<RCC_D3CCIPR_ADCSEL_Pos))|

    //LPTIM3,4,5 内核时钟源选择
    //0x0U：将 rcc_pclk4 时钟选作内核外设时钟（复位后的默认值）
    //0x1U：将 pll2_p_ck 时钟选作内核外设时钟
    //0x2U：将 pll3_r_ck 时钟选作内核外设时钟
    //0x3U：将 lse_ck 时钟选作内核外设时钟
    //0x4U：将 lsi_ck 时钟选作内核外设时钟
    //0x5U：将 per_ck 时钟选作内核外设时钟
    (RCC_D3CCIPR_LPTIM345SEL_Msk&(0x0U<<RCC_D3CCIPR_LPTIM345SEL_Pos))|

    //LPTIM2 内核时钟源选择
    //0x0U：将 rcc_pclk4 时钟选作内核外设时钟（复位后的默认值）
    //0x1U：将 pll2_p_ck 时钟选作内核外设时钟
    //0x2U：将 pll3_r_ck 时钟选作内核外设时钟
    //0x3U：将 lse_ck 时钟选作内核外设时钟
    //0x4U：将 lsi_ck 时钟选作内核外设时钟
    //0x5U：将 per_ck 时钟选作内核外设时钟
    (RCC_D3CCIPR_LPTIM2SEL_Msk&(0x0U<<RCC_D3CCIPR_LPTIM2SEL_Pos))|

    //I2C4 内核时钟源选择
    //0x0U：将 rcc_pclk4 时钟选作内核外设时钟（复位后的默认值）
    //0x1U：将 pll3_r_ck 时钟选作内核外设时钟
    //0x2U：将 hsi_ker_ck 时钟选作内核外设时钟
    //0x3U：将 csi_ker_ck 时钟选作内核外设时钟
    (RCC_D3CCIPR_I2C4SEL_Msk&(0x0U<<RCC_D3CCIPR_I2C4SEL_Pos))|
    
    //LPUART1 内核时钟源选择
    //0x0U：将 rcc_pclk_d3 时钟选作内核外设时钟（复位后的默认值）
    //0x1U：将 pll2_q_ck 时钟选作内核外设时钟
    //0x2U：将 pll3_q_ck 时钟选作内核外设时钟
    //0x3U：将 hsi_ker_ck 时钟选作内核外设时钟
    //0x4U：将 csi_ker_ck 时钟选作内核外设时钟
    //0x5U：将 lse_ck 时钟选作内核外设时钟
    (RCC_D3CCIPR_LPUART1SEL_Msk&(0x0U<<RCC_D3CCIPR_LPUART1SEL_Pos));

}

void MPU_Config(void){

  __DSB();
  __ISB();
  MPU->CTRL=0U;//失能MPU
  __DSB();
  __ISB();


  oIP_MPU_EnableRegion_Normal_NoCache(0U,0x00000000U,0U,vIP_MPU_AP_PRO_URO,0U,0x00U,vIP_MPU_Size_64KB);
  oIP_MPU_EnableRegion_Normal_WB(1U,0x90000000U,0U,vIP_MPU_AP_PRO_URO,0U,0x00U,vIP_MPU_Size_256MB);
  oIP_MPU_EnableRegion_Normal_NoCache(2U,0x20000000U,0U,vIP_MPU_AP_FullAccess,0U,0x00U,vIP_MPU_Size_128KB);
  oIP_MPU_EnableRegion_Normal_NoCache(3U,0x24000000U,0U,vIP_MPU_AP_FullAccess,0U,0x00U,vIP_MPU_Size_512KB);
  oIP_MPU_EnableRegion_Normal_WB(4U,0x30000000U,0U,vIP_MPU_AP_FullAccess,0U,0x00U,vIP_MPU_Size_256KB);
  oIP_MPU_EnableRegion_Normal_NoCache(5U,0x30040000U,0U,vIP_MPU_AP_FullAccess,0U,0x00U,vIP_MPU_Size_32KB);
  oIP_MPU_EnableRegion_Normal_NoCache(6U,0x38000000U,0U,vIP_MPU_AP_FullAccess,0U,0x00U,vIP_MPU_Size_64KB);
  oIP_MPU_EnableRegion_Normal_NoCache(7U,0x38800000U,0U,vIP_MPU_AP_FullAccess,0U,0x00U,vIP_MPU_Size_4KB);
  

  __DSB();
  __ISB();
  MPU->CTRL=MPU_CTRL_PRIVDEFENA_Msk|MPU_CTRL_ENABLE_Msk;//使能MPU
  __DSB();
  __ISB();

}



